5.3 构建环境因子背景矩阵
遵循以下原则:
参照Guisan[22]和Zhu[23]等的建议设定4条筛选原则来选择环境变量:
1、尽可能选择直接影响物种实际分布的近端作用变量和物种的生态需求密切相关的变量;2、基于物种生理耐受性的Jackniffe方法[24],利用SDM(如Maxent)选择单因子建模更高解释度的变量[附录S2]。
3、为使建模结果更具有可解释性以及降低过拟合的可能性,需要去除变量间的强共线性关系(|r|>0.8)[25][附录S3];
4、去除生物气候变量中部分温度和降雨结合的变量。
[23] Fan J Y , Zhao N X , Li M , et al. (2018)What are the best predictors for invasive potential of weeds? Transferability evaluations of model predictions based on diverse environmental data sets for Flaveria bidentis[J]. Weed Research.
[24] Steven J. P , Robert P.ER , Robert E. S. (2006)Maximum entropy modeling of species geographic distributions[J]. Ecological Modelling.
5.3.1 提取环境背景信息
library(raster)
library(dsimo)
> exs <- extract(predictors, bradypus)
summary(exs)
来自:
https://ecologicaconciencia.wordpress.com/
elev2<-resample(x=elev, y=ndvi, method="bilinear")
5.3.2 环境背景信息数据转换
aggregate(iris[1:4],list(iris$Species),mean)
5.4 环境因子相关性分析
5.4.1 因子筛选主流方法
目前关于环境因子分析和筛选过程中,目前已经得到较认可的环境筛选方法是:
将所有环境因子纳入到建模分析钟,选择maxnet或者其他模型进行建模分析,根据建模的混淆矩阵评估建模结果的优劣;选择其中较好的建模结果(AUC.kappa)的结果模型提取主要贡献环境因子。
利用提取的环境因子信息矩阵,进行pearson分析,筛选环境变量相关性r>0.8以上的环境变量;
结合研究对象的生态分布信息,和植物生理生化需求选择合适的环境模糊因子;
因为刀切法中的建模环境因子仅基于数值统计,反映的是数据特征和数据波动的概率偏好,但不能反映的实际的环境因子需求;因此,使用3中筛选的模糊环境因子替换掉相关性较强的非相关生理因子进行建模;
统计建模结果的auc或者其他统计变量,若模型仍有较低的遗漏率,则说明环境因子的替代是合理的;如果建模评价变差,则需要重新考虑和替换,原因可能有 如下几个方面:第一是专家意见判读不准确;第二是因子间关系非线性,有可能是高维相关;
第三是:模型在调参过程中选择的参数修正方式对线性关系不敏感;
plot(rattler.me)
p1 <- cor(data1[,-1],method = "pearson")
library(pheatmap)
pheatmap(p1,cluster_cols = F,display_numbers = T,main = "环境因子相关性分析")
pairs(sdmdata[,2:5], cex=0.1, fig=TRUE)
set.seed(123)
dd = as.data.frame(matrix(rnorm(1000),100,10))
library(Hmisc)
res2 <- rcorr(as.matrix(dd))
library(PerformanceAnalytics)
chart.Correlation(dd, histogram=TRUE, pch=19)
https://www.sohu.com/a/400959520_120736615
5.4.2 因子筛选其他方法
library(dismo)
predictors <- stack(files)
VIF.analysis <- ensemble.VIF(predictors, factors="xiz高程.tif ")
predictors
5.4.3 ENFA
刀切法、置换重要性及ENFA
rm(list = ls())
setwd("C:\\Users\\admin\\Desktop")
library(SDMtune)
library(ENMeval)
library(raster)
library(rgdal)
library(maps)
library(mapdata)
library(dismo)
library(rJava)
library(maptools)
library(jsonlite)
library(glmnet)
library(maxnet)
library(rasterVis)
library(ggplot2)
dismo::maxent()
xh_sa <- read.csv("D:/XH/第二阶段/xh/na.csv")
head(xh_sa)
xh_sa <- xh_sa[,2:3]
tifs <- list.files(path ="D:/XH/第三阶段_env/envsV3tif/",pattern="tif",full.names =T)
tiffs <- stack(tifs)
crs.geo <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84")
proj4string(tiffs) <- crs.geo
occs <- xh_sa
xmin <- min(occs$longitude)
xmax <- max(occs$longitude)
ymin <- min(occs$latitude)
ymax <- max(occs$latitude)
bb <- matrix(c(xmin, xmin, xmax, xmax, xmin, ymin, ymax, ymax, ymin, ymin), ncol=2)
bgExt <- sp::SpatialPolygons(list(sp::Polygons(list(sp::Polygon(bb)), 1)))
plot(env_bgExt)
bgExt <- rgeos::gBuffer(bgExt, width = 0.5)
env_bgExt <- raster::mask(crop(tiffs$BIO17, bgExt),bgExt)
envs_bios <- crop(tiffs,env_bgExt)
bg.xy <- dismo::randomPoints(env_bgExt, 5000,p= occs)
bg_xy <- as.data.frame(bg.xy,colnames(c("long","lat")))
crs.geo <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84")
proj4string(envs_bios) <- crs.geo
data <- prepareSWD(species = "xh_sa species",
p =occs , a = bg_xy,
env = envs_bios)
head(data@data)
library(zeallot)
library(ENMeval)
c(train, test) %<-% trainValTest(data, test = 0.2, only_presence = TRUE, seed = 25)
maxnet_model <- train("Maxnet", data = train, fc = "lqp", reg = 1,iter=500)
auc(maxnet_model)
vi_maxnet <- varImp(maxnet_model, permut = 100)
vi_sa <- vi_maxnet
jk <- doJk(maxnet_model, metric = "auc", test = test)
jk_sa <- jk
library(dismo)
data(Anguilla_train)
head(Anguilla_train)
data@pa
sdmdata_sa <- cbind(data@data,data@pa)
dim(sdmdata_sa)
head(sdmdata_sa)
angaus.tc5.lr01 <- gbm.step(data=sdmdata_sa, gbm.x = 1:26, gbm.y = 27,
family = "bernoulli", tree.complexity = 5,
learning.rate = 0.01, bag.fraction = 0.5)
names(angaus.tc5.lr01)
brt_sa <- summary(angaus.tc5.lr01)
library(CENFA)
occ_sa <- data@coords[data@pa==1,]
head(occ_sa)
head(xh_sa)
library(sp)
coordinates(xh_sa) <- ~ longitude +latitude
crs.geo <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84")
crs.geo <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84")
proj4string(xh_sa) <- crs.geo
library(adehabitatHR)
occ_kde <- kernelUD(xh_sa, h="LSCV", hlim = c(0.5, 1.5))
occ_kde_poly <- getverticeshr(occ_kde, percent = 90)
plot(turtle.kernel.poly, col = occ_kde$ud)
points(xh_sa)
mod.enfa <- enfa(x = envs_bios, s.dat = occ_kde_poly)
enfa_sa <- mod.enfa
glc <- GLcenfa(x = envs_bios)
scatter(x = mod.enfa, y = glc)
mod.cnfa <- cnfa(x = envs_bios, s.dat = occ_kde_poly)
cnfa_sa <- mod.cnfa
sink("./sa.txt")
vi_sa
jk_sa
brt_sa
cnfa_sa
sink()
其他筛选环境变量的方法
https://academic.oup.com/jmammal/article/96/3/511/905515